#include <signal.h>
#include <iostream>
void PrintPending(const sigset_t &_pending)
{
    std::cout << "curr pending list[ " << getpid() << "]:";
    for (int _num = 31; _num > 0; _num--)
    {
        if (sigismember(&_pending, _num))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

int main()
{

    ::signal(2, SIG_IGN); // 把二号信号的处理方式改成忽略

    ::sigset_t _set;
    if (::sigemptyset(&_set) == -1)
    {
        ::perror("sigemptyset1");
        ::exit(EXIT_FAILURE);
    } // 这里是初始化set

    ::sigset_t _old_set;
    if (::sigemptyset(&_old_set) == -1)
    {
        ::perror("sigemptyset1");
        ::exit(EXIT_FAILURE);
        // 这里初始化旧的set
    }

    if (::sigaddset(&_set, 2))
    {
        ::perror("sigaddset:");
    }
    // 添加信号到信号集：::sigaddset(&_set, 2) 将 SIGINT 信号添加到 _set 中

    if (::sigprocmask(SIG_SETMASK, &_set, &_old_set))
    {
        ::perror("sigprocmask:");
        ::exit(EXIT_FAILURE);
    }
    // ::sigprocmask(SIG_SETMASK, &_set, &_old_set) 将当前信号掩码替换为 _set 中的信号集，并保存旧的信号掩码到 _old_set 中。

    // 获取pending表格

    int _print_num = 0;
    while (true)
    {
        sigset_t _pengding;
        if (::sigpending(&_pengding) == -1)
        {
            ::perror("sigpending:");
        }
        // 获取pending 表格
        PrintPending(_pengding);

        _print_num++;
        if (_print_num == 10)
        {
            // 解除对二号信号的屏蔽
            sigprocmask(SIG_SETMASK, &_old_set, nullptr);
            std::cout << "sigprocmask(SIG_SETMASK, &_old_set, nullptr);" << std::endl;
            // 内核中进程使用老的set,不保存
        }

        sleep(1);
    }

    return 0;
}
